﻿
CREATE PROCEDURE [dbo].[GoodsUpdate]
(
	@AssortmentId int,
	@ManufacturerId int,
	@CountryId int,
	@WholesalePack int,
	@RetailPack int,
	@ChildId int,
	@AllowUnPack bit,
	@ManufactureBarCode varchar(13),
	@FixedPrice decimal(19, 2), --Розничная цена по умолчанию
	@ToDelete bit,
	@DefekturaAggregate bit,
	@Note varchar(250),
	@MD datetime,
	@MW varchar(50),
	@Original_Id int,
	@Original_MD datetime
)
AS
DECLARE @strMsg nvarchar(500), @intRet int, @intErrCode int
DECLARE @orgAssortmentId int, @orgManufacturerId int, @orgCountryId int, @orgRetailPack int
DECLARE @orgToDelete bit, @orgParentToDelete bit, @intChildRetailPack int
SET NOCOUNT ON

IF (@AssortmentId Is Null) OR (@ManufacturerId Is Null) 
OR (@CountryId Is Null) OR (@RetailPack Is Null)
OR (@WholesalePack Is Null) OR (@AllowUnPack Is Null) OR (@DefekturaAggregate Is Null)
OR (@ToDelete Is Null)
BEGIN
	SELECT @intErrCode = 1, @strMsg = 'Неправильные параметры в вызове процедуры ' + Object_Name(@@Procid) + ' !'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

SELECT @orgAssortmentId = AssortmentId, @orgManufacturerId = ManufacturerId,
@orgCountryId = CountryId, @orgRetailPack = RetailPack, @orgToDelete = ToDelete
FROM CA.Goods WHERE Id = @Original_Id AND MD = @Original_MD
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 2, 
	@strMsg = 'Данные изменены после последнего запроса!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @orgParentToDelete = ToDelete
FROM CA.Assortment WHERE Id = @AssortmentId
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 3, 
	@strMsg = 'Отсутствует родительская запись с кодом ' + cast(@AssortmentId as varchar(20)) + ' в справочнике препаратов!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF @orgParentToDelete = 1 
BEGIN
	SELECT @intErrCode = 4, 
	@strMsg = 'Родительская запись с кодом ' + cast(@AssortmentId as varchar(20)) + ' в справочнике препаратов отмечена для удаления!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @orgParentToDelete = ToDelete
FROM CO.Manufacturers WHERE Id = @ManufacturerId
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 5, 
	@strMsg = 'Отсутствует родительская запись с кодом ' + cast(@ManufacturerId as varchar(20)) + ' в справочнике препаратов!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF @orgParentToDelete = 1 
BEGIN
	SELECT @intErrCode = 6, 
	@strMsg = 'Родительская запись с кодом ' + cast(@ManufacturerId as varchar(20)) + ' в справочнике препаратов отмечена для удаления!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @orgParentToDelete = ToDelete
FROM CO.Countries WHERE Id = @CountryId
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 7, 
	@strMsg = 'Отсутствует родительская запись с кодом ' + cast(@CountryId as varchar(20)) + ' в справочнике стран!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF @orgParentToDelete = 1 
BEGIN
	SELECT @intErrCode = 8, 
	@strMsg = 'Родительская запись с кодом ' + cast(@CountryId as varchar(20)) + ' в справочнике стран отмечена для удаления!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF @orgToDelete = 1 --Запись была отмечена для удаления
BEGIN
	IF @ToDelete = 1 
	BEGIN
		SELECT @intErrCode = 9, 
		@strMsg = 'Нельзя редактировать запись, отмеченную для удаления!'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END
END ELSE BEGIN
	IF @ToDelete = 1 
	BEGIN
		SELECT @intErrCode = 10, 
		@strMsg = 'Для удаления данных должна использоваться другая процедура!'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END
END

IF (@orgAssortmentId <> @AssortmentId) OR (@orgManufacturerId <> @ManufacturerId)
OR (@orgCountryId <> @CountryId) OR (@orgRetailPack <> @RetailPack)
BEGIN
	IF EXISTS (SELECT TOP 1 ID FROM CA.Goods 
	WHERE AssortmentId = @AssortmentId AND ManufacturerId = @ManufacturerId 
	AND CountryId = @CountryId AND RetailPack = @RetailPack AND ToDelete = 0) 
	BEGIN
		SELECT @intErrCode = 11, @strMsg = 'Дублируется товар!'
		RAISERROR (@strMsg, 11, @intErrCode)
		RETURN @intErrCode
	END
END

EXEC [dbo].[ProcessStatistic] @Note OUTPUT, @MD OUTPUT, @MW OUTPUT

BEGIN TRAN

IF @ChildId IS NOT NULL
BEGIN
--для родителя основные реквизиты товара берутся из потомка

	SELECT @AssortmentId = AssortmentId, @ManufacturerId = ManufacturerId, 
	@CountryId = CountryId, @intChildRetailPack = RetailPack
	FROM CA.Goods WHERE Id = @ChildId

	IF (@@rowcount = 0)
	BEGIN
		IF @@trancount > 0 ROLLBACK TRAN
		SELECT @intErrCode = 4, @strMsg = 'Не найден дочерний товар с идентификатором ' + cast(@ChildId as varchar(10)) + ' !'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END

	IF @RetailPack <= @intChildRetailPack
	BEGIN
		IF @@trancount > 0 ROLLBACK TRAN
		SELECT @intErrCode = 5, 
		@strMsg = 'Количество в розничной упаковке для родителей должно быть больше количества у потомка с идентификатором ' + cast(@ChildId as varchar(10)) + ' !'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END

	IF (@RetailPack % @intChildRetailPack) <> 0
	BEGIN
		IF @@trancount > 0 ROLLBACK TRAN
		SELECT @intErrCode = 6, 
		@strMsg = 'Количество в розничной упаковке для родителей должно в целое число раз превосходить количество у потомка с идентификатором ' + cast(@ChildId as varchar(10)) + ' !'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END
END

IF EXISTS (
SELECT * FROM [CA].[Goods] C 
WHERE ChildId = @Original_Id AND ( ( (RetailPack % @RetailPack) <> 0) OR (RetailPack <= @RetailPack) ) )
BEGIN
	IF @@trancount > 0 ROLLBACK TRAN
	SELECT @intErrCode = 7, 
	@strMsg = 'Количество в розничной упаковке для родителей должно в целое число раз превосходить количество у потомка с идентификатором ' + cast(@Original_Id as varchar(10)) + ' !'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

--обновляем основные реквизиты всех возможных родственников
UPDATE D SET 
D.[AssortmentId] = @AssortmentId, 
D.[ManufacturerId] = @ManufacturerId, 
D.[CountryId] = @CountryId, 
D.[MD] = @MD, D.[MW] = @MW 
FROM [CA].[Goods] D INNER JOIN [dbo].[RelativeGoods](@Original_Id) S ON D.Id = S.Id

	SET NOCOUNT OFF;

UPDATE [CA].[Goods] SET 
[AssortmentId] = @AssortmentId, 
[ManufacturerId] = @ManufacturerId, 
[CountryId] = @CountryId, 
[WholesalePack] = @WholesalePack, 
[RetailPack] = @RetailPack, 
ChildId = @ChildId,
[AllowUnPack] = @AllowUnPack, 
[ManufactureBarCode] = @ManufactureBarCode, 
FixedPrice = @FixedPrice,
DefekturaAggregate = @DefekturaAggregate,
[Note] = @Note, [MD] = @MD, [MW] = @MW, ToDelete = @ToDelete 
WHERE Id = @Original_Id;

COMMIT TRAN

SELECT Id, GId, AssortmentId, ManufacturerId, CountryId, WholesalePack, RetailPack, ChildId, 
AllowUnPack, ManufactureBarCode, FixedPrice, DefekturaAggregate, Note, MD, MW, ToDelete
FROM CA.Goods WHERE (Id = @Original_Id)

RETURN 0
